/**
 * 动物类构造方法
 */
function Animal(name,age){
	// 添加类构造属性
	this.name = name
	this.age = age
}

/**
 * 构造方法赋值
 */
Animal.prototype.constructor = Animal

/**
 * 添加类原型属性
 */
Animal.prototype.sex = 1

/**
 * 添加类原型方法
 */
Animal.prototype.eat = function(food){
	var name = this.name
	console.log(`${name} like eat ${food}.`)
}

/* 测试 */
console.log('-----------------------------------------');
var cat = new Animal('cat',2)
// 在实例上添加属性
Object.defineProperties(cat, {
  job:{
	value:'pet',
    enumerable:false //不可枚举,默认为false
  },
  address:{
    value:'beijing',
	enumerable:true
  }
})
console.log('proto:',cat.__proto__); // { sex: 1, eat: [Function (anonymous)] }
console.log('age:',cat.age); //2
console.log('constructor:',cat.constructor); // [Function: Animal]
console.log('object name:',cat.constructor.name); //Animal
// 返回对象可枚举的属性。不含原型链属性。
console.log('keys',Object.keys(cat)); //[ 'name', 'age', 'address' ]
// 返回对象的所有自有属性的名称，包含不可枚举的属性。不含原型链属性。
console.log('ownProps',Object.getOwnPropertyNames(cat)); // [ 'name', 'age', 'job', 'address' ]
console.log('entries',Object.entries(cat)); // [ [ 'name', 'cat' ], [ 'age', 2 ], [ 'address', 'beijing' ] ]
cat.eat('fish') //cat like eat fish.
console.log('-----------------------------------------');

/**
 * 子类，构造继承Animal
 */
function Dog(name,age,breed){
	// 继承父类构造属性
	Animal.call(this,name,age)
	// 自有构造属性 breed-品种
	this.breed = breed
}

/**
 * 构造方法赋值
 */
Dog.prototype.constructor = Dog

/**
 * 子类，原型继承Animal
 */
Dog.prototype = Object.create(Animal.prototype)

/**
 * 添加原型方法
 */
Dog.prototype.say = function(){
	console.log(`Dog ${this.name} say wangwang.`)
}

/* 测试 */
console.log('-----------------------------------------');
var dog = new Dog('xiaohei',5,'TuGou')
console.log('proto:',dog.__proto__); // { say: [Function (anonymous)] }
console.log('age:',dog.age); //5
console.log('constructor:',dog.constructor); // [Function: Animal]
console.log('object name:',dog.constructor.name); //Animal
// 返回对象可枚举的属性。不含原型链属性。
console.log('keys',Object.keys(dog)); // [ 'name', 'age', 'breed' ]
// 返回对象的所有自有属性的名称，包含不可枚举的属性。不含原型链属性。
console.log('ownProps',Object.getOwnPropertyNames(dog)); //  [ 'name', 'age', 'breed' ]
console.log('entries',Object.entries(dog)); //  [ [ 'name', 'xiaohei' ], [ 'age', 5 ], [ 'breed', 'TuGou' ] ]
dog.eat('meat') //xiaohei like eat meat.
dog.say() //Dog xiaohei say wangwang.
console.log('-----------------------------------------');